home *** CD-ROM | disk | FTP | other *** search
/ Apple WWDC 1996 / WWDC96_1996 (CD).toast / Technology Materials / QuickTime VR / MacOS / QuickDraw™ 3D 1.0.6F4 SDK / Samples / SampleCode / Unsupported Libraries / PackBytes.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-03-05  |  4.3 KB  |  195 lines  |  [TEXT/MPS ]

  1. /******************************************************************************
  2.  **                                                                             **
  3.  **     Module:        PackBytes.c                                                 **
  4.  **                                                                          **
  5.  **                                                                          **
  6.  **     Purpose:                                                              **
  7.  **                                                                          **
  8.  **                                                                          **
  9.  **                                                                          **
  10.  **     Copyright (C) 1988-1990 Apple Computer, Inc.  All rights reserved.     **
  11.  **                                                                          **
  12.  **                                                                          **
  13.  *****************************************************************************/
  14.  
  15. #include "PackBytes.h"
  16.  
  17. #if defined(applec) || defined(THINK_C) || defined(powerc) || defined(__MWERKS__)
  18. #include <ToolUtils.h>
  19. #else /* !(defined(macintosh) || defined(THINK_C)) */
  20.  
  21. #ifdef __cplusplus
  22. extern "C" {
  23. #endif    /* __cplusplus */
  24.  
  25.  
  26. /*===========================================================================*\
  27.  *
  28.  *    Routine:    PackBits()
  29.  *
  30.  *    Comments:    
  31.  *
  32. \*===========================================================================*/
  33.  
  34. void PackBits(
  35.     char     **srcPtr, 
  36.     char     **dstPtr, 
  37.     short     srcBytes)
  38. {
  39.     register char     *s, *d;
  40.     char             *countLoc;
  41.     register short     count, lastByte;
  42.     short             tinycount;
  43.  
  44.     s = *srcPtr;
  45.     d = *dstPtr;
  46.     
  47.     count = 0;
  48.     lastByte = 256; /* an impossible value */
  49.     
  50.     while (srcBytes) {
  51.         /* Look for runs */
  52.         while (srcBytes && ((*s == lastByte) || lastByte == 256)) { /* Runs */
  53.              srcBytes--;
  54.              lastByte = *s++;
  55.              if (++count == 128)    
  56.                  /* 129 is max, but Mac toolbox can't. -128 = 0x80 */
  57.                 break;
  58.         }
  59.         if (count >= 3) {    /* Flush run and reset machine */
  60.             *d++ = -(count - 1);
  61.             *d++ = lastByte;
  62.             count = 0;
  63.             lastByte = 256;
  64.             continue;
  65.         }
  66.         
  67.         /* Look for vectors */
  68.         countLoc = d++;        /* Save location for back-fitting the count */
  69.         for (tinycount = count; tinycount; tinycount--)
  70.             *d++ = lastByte;    /* Copy any tiny runs */
  71.         
  72.         while (srcBytes) {
  73.             if ((s[0] == lastByte) && (s[1] == lastByte) && (srcBytes >= 2)) {
  74.                 d--;        /* remove the last byte, save for runlength */
  75.                 s--;
  76.                 if (--count == 0)
  77.                     d--;            /* Remove placeholder at countLoc */
  78.                 srcBytes++;
  79.                 break;
  80.             }
  81.             srcBytes--;
  82.             lastByte = *d++ = *s++;
  83.             if (++count == 128) /* 127 = 0xFF */
  84.                 break;
  85.         }
  86.         if (count) {
  87.             *countLoc = count - 1;        /* Store vector count */
  88.             count = 0;
  89.         }
  90.         lastByte = 256;
  91.     }
  92.     
  93.     *srcPtr = s;
  94.     *dstPtr = d;
  95. }
  96.  
  97.  
  98. /*===========================================================================*\
  99.  *
  100.  *    Routine:    UnpackBits()
  101.  *
  102.  *    Comments:    
  103.  *
  104. \*===========================================================================*/
  105.  
  106. void UnpackBits(
  107.     char             **srcPtr, 
  108.     char             **dstPtr, 
  109.     register short     dstBytes)
  110. {
  111.     register char     *s, *d;
  112.     register short     count, val;
  113.     
  114.     s = *srcPtr;
  115.     d = *dstPtr;
  116.  
  117.     while (dstBytes) {
  118.         if (*s & 0x80) {    /* a run */
  119.             if ((count = -(*s++ | ~0xFF)) >= dstBytes)    /* run longer than requested */
  120.                 count = dstBytes-1; /* zero-based count */
  121.             dstBytes -= count + 1;
  122.             val = *s++;
  123.             do { *d++ = val; } while (count--);
  124.         }
  125.         else {            /* a vector */
  126.             if ((count = *s++) >= dstBytes)    /* vector longer than requested */
  127.                 count = dstBytes-1; /* zero-based count */
  128.             dstBytes -= count + 1;
  129.             do { *d++ = *s++; } while (count--);
  130.         }
  131.     }
  132.     
  133.     *srcPtr = (char *)s;
  134.     *dstPtr = (char *)d;
  135. }
  136.  
  137. #ifdef __cplusplus
  138. }    /* end extern "C" */
  139. #endif    /* __cplusplus */
  140.  
  141. #endif /* macintosh */
  142.  
  143.  
  144. #ifdef __cplusplus
  145. extern "C" {
  146. #endif    /* __cplusplus */
  147.  
  148.  
  149. #define RUNLENGTH 32767
  150. /*===========================================================================*\
  151.  *
  152.  *    Routine:    PackBytes()
  153.  *
  154.  *    Comments:    
  155.  *
  156. \*===========================================================================*/
  157.  
  158. unsigned long PackBytes(
  159.     char            *from, 
  160.     char            *to, 
  161.     unsigned long     nBytes)
  162. {
  163.     char *src = from, *dst = to;
  164.     long count;
  165.     
  166.     for (count = (long)nBytes; count > 0; count -= RUNLENGTH)
  167.         PackBits(&src, &dst, (count > RUNLENGTH) ? RUNLENGTH : (short)count);
  168.     return (dst - to);
  169. }
  170.  
  171.  
  172. /*===========================================================================*\
  173.  *
  174.  *    Routine:    UnpackBytes()
  175.  *
  176.  *    Comments:    
  177.  *
  178. \*===========================================================================*/
  179.  
  180. void UnpackBytes(
  181.     char            *src, 
  182.     char            *dst, 
  183.     unsigned long     nBytes)
  184. {
  185.     long count;
  186.     
  187.     for (count = (long)nBytes; count > 0; count -= (long)RUNLENGTH)
  188.         UnpackBits(&src, &dst, (count > RUNLENGTH) ? RUNLENGTH : (short)count);
  189. }
  190.  
  191.  
  192. #ifdef __cplusplus
  193. }    /* end extern "C" */
  194. #endif    /* __cplusplus */
  195.